package com.ug_project.views

import android.content.Context
import android.graphics.Typeface
import android.view.ViewGroup
import android.widget.TextView
import java.util.*

/**
 * Created by yeganaaa on 17-1-22.
 */
/**
 *سۈكۈتتىكى خەت نۇسقىسى
 */

const val FONT_NAME: String = "default.TTF"
//const val FONT_NAME: String = "UKIJEkran.ttf"
/**
 *بارلىق خەت نۇسقىلىرى
 */
internal var Type_Faces = HashMap<String, Typeface>()
/**
 *TextView
 * غا ۋارىسلىق قىلغان بارلىق ئبىيكىتلارنىڭ كىڭەيىتمە خاسلىقى
 */
var android.widget.TextView.font: String?
get() = if (this is INew_View) this._font else null
set(value) {
    var (typeface, assets_name, is_error) = Get_Font(this.context, value ?: FONT_NAME)
    this.typeface = typeface
    if (this is INew_View) this._font = assets_name
}
/**
 *View Group
 * لارنىڭ ۋە ۋارىسلىق قىلغان بارلىق ئبىيكىتلارنىڭ كىڭەيتمە خاسلىقى
 */
var ViewGroup.font: String?
    /**
    * ئەگەر نۆۋەتتىكى
     * View Group
     * قايتىدىن يىزىلىپ چىققان بولسا خەت نۇسقىسىنىڭ ئسمىنى قايتۇرىدۇ، ئنداق بولمىسا قۇرۇق قىممەت قايتۇرىدۇ
     */
    get() = if (this is INew_ViewGroup) _font else null
    set(value) {
        /**
         * View Group
         * تىپىدىكىلەر ئۈچۈن ھەر بىر ئلىمىنىتلىرىغىچە خەت نۇسقىسىنى تەڭشەيدۇ
         */
        if (this is INew_ViewGroup) if (value.isNotNullOrEmpty()) this._font = value
        fun Set_Font(parent: ViewGroup) {
            loop@ for (index in 0..parent.childCount - 1) {
                var Item = parent.getChildAt(index)
                when (Item) {
                /**
                 *TextView
                 * بىلەن تۇققاندارچىلىقى بار بولۇپ قالسا
                 */
                    is TextView -> {
                        /**
                         *ئۆزىمىز قايتىدىن بەلگىلىگەن
                         * View
                         *  بولسا
                         */
                        if (Item is INew_View) {
                            /**
                             *ئەگەر ئللىبۇرۇن خەت نۇسقىسى بىرىلىپ بولغان بولسا قايتا باستۇرۇپ تەڭشىۋەتمىسۇن
                             */
                            if (Item.font.isNotNullOrEmpty())
                                continue@loop
                        }
                        Item.font = value
                    }
                /**
                 *ئەگەر
                 * ViewGroup
                 * نىڭ تۇققانلىرى بولسا يەنى قاچا بولسا قاچا ئچىدىكى بارلىق تارماق
                 * View
                 * لارنىڭ خەت نۇسقىسىنى تەڭشىشى كىرەك
                 */
                    is ViewGroup -> {
                        /**
                         *ئەلۋەتتە ئزىمىز بەلگىلىگەن قاچا بولۇپ قالسا ھەم بۇرۇن خەت نۇسقىسى تەڭشەلگەن بولسا قايتا تەڭشەشنىڭ ھاجىتى يوق
                         */
                        if (!(Item is INew_ViewGroup && Item.font.isNullOrEmpty())) Set_Font(Item)
                    }
                }
            }
        }
        /**
         *ئەگەر نۆۋەتتىكى قاچىنىڭ خەت نۇسقىسى بولسا بار خەت نۇسقىسىنى ئچىدىكى تارماق كونتىروللارغا تەقسىم قىلىپ بەرسۇن
         */
        if (this.font.isNullOrEmpty()) {
            /**
             *ئەگەر خەت نۇسقىسى بولمىسا سۈكۈتتىكىنى ئشلەتسۇن
             */
            if (this is INew_ViewGroup) {
                this._font = FONT_NAME
            }
        }
        Set_Font(this)
    }

/**
 * String, String?
 * لار ئۈچۈن كىڭەيىتمە فۇنكىسىيە
 * قۇرۇق بولمىسا
 */
internal fun String?.isNotNullOrEmpty() : Boolean = if (this == null) false else if (this == "") false else true
/**
 *
 */
internal data class Result(var type_face: Typeface, var asset_font_name: String, var is_error: Boolean)
/**
 *خەت نۇسقىسىنى مەنبە ھۆججەتتىن ئوقۇپ قايتۇرىدۇ
 * ئەگەر بۇرۇن بىر قىتىم ئوقۇلۇپ بولغان بولسا ئقۇپ بولغىنىنى قايتۇرىدۇ
 */
internal fun Get_Font(context: Context, asset_font_name: String) : Result {
    var Is_Error = false
    return Result(try {
        /**
         *خەت نۇسقىسى بولمىسا ئوقۇپ ساقلىۋالىدۇ
         */
        if (!Type_Faces.keys.contains(asset_font_name)) Type_Faces.put(asset_font_name, Typeface.createFromAsset(context.assets, asset_font_name))
        /**
         * ئەگەر بار بولسا بار بولغىنىنى قايتۇرىدۇ
         */
        Type_Faces[asset_font_name]!!
    } catch (error: Exception) {
        println("***************************************خەت نۇسقىسى ھۆججىتىنى يۈكلەش جەريانىدا خاتالىق يۈز بەردى!***************************************")
        println("***************************************ttf\nفورماتىدىكى خەت نۇسقىسى ھۆججىتىنى \nassets\nمۇندەرىجىسىگە قويۇپ ئاندىن كىڭەيتىلگەن نامىنى ئۆز ئىچىگە ئالغان تولۇق ئىسمىنى پارامىتىر قىلىپ بىرىڭ***************************************")
        println("***************************************http://www.sarkar.cn***************************************")
        Is_Error = true
        if (!Type_Faces.keys.contains(FONT_NAME)) Type_Faces.put(FONT_NAME, Typeface.createFromAsset(context.assets, FONT_NAME))
        Type_Faces[FONT_NAME]!!
    }, if (Is_Error) FONT_NAME else asset_font_name, Is_Error)
}